/**
 * 
 */
package com.proyecto.histoclin.modelo.servicios;

import java.util.List;

import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.histoclin.modelo.dto.CorrelativosHistoclinId;
import com.proyecto.histoclin.modelo.dto.HistoclinProcedimientos;

/**
 * @author vico
 *
 */
public class ServicioHistoclinProcedimientos extends ServicioGenerico {

	/**
	 * 
	 */
	ServicioCorrelativosHistoclin servicioCorrelativosHistoclin;
	ServicioHistoclinConsentosinfo servicioHistoclinConsentosinfo;
	public ServicioHistoclinProcedimientos() {
		// TODO Auto-generated constructor stub
	}

	
	
	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub


		HistoclinProcedimientos objHistoclinProcedimientos = (HistoclinProcedimientos)pojo;

		if (isValidacionActiva()){
			validacion.incluir(objHistoclinProcedimientos);
		}
		
		
		try {
			
			String proxNumero = servicioCorrelativosHistoclin.obtenerProximoNumeroComoString(
					new CorrelativosHistoclinId (objHistoclinProcedimientos.getId().getCiaopr(), "HC_PROCEDIM","procedimcod" ) ,true);

			objHistoclinProcedimientos.getId().setProcedimcod( Integer.parseInt(proxNumero) );

	
			super.incluir(objHistoclinProcedimientos, iniciaTransaccion);

			servicioHistoclinConsentosinfo.crearHistoclinConsentosinfo_byProcedimientos(
					objHistoclinProcedimientos.getId().getCiaopr(), 
					objHistoclinProcedimientos.getId().getHisclicod(),
					objHistoclinProcedimientos.getNropersona(),
					objHistoclinProcedimientos.getId().getProcedimcod(),
					objHistoclinProcedimientos.getCupscod(),
					objHistoclinProcedimientos.getFchprocedim());
			
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
			} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.registroDuplicado");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");

		} catch (org.springframework.dao.DataAccessResourceFailureException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
				throw new GeneralException(
						"error." + claveProperties + ".conexion");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");
		} catch (Exception e) {
			System.err.println(":::ServicioHistoclinProcedimientos::: " + e.getMessage());
			if("advertencia.HistoriasClinicas.datosBasicos.HistoclinProcedimientos.modificar.BloqueoOptimista".equals(e.getMessage())){
				throw new GeneralException(	e.getMessage());
			}else{
				throw new GeneralException(
						"error." + claveProperties + ".desconocido");
			}
		}
		
	}

	
	
	@Override
	public void eliminar(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub
		HistoclinProcedimientos objHistoclinProcedimientos = (HistoclinProcedimientos)pojo;
		System.out.println("eliminar.ServicioHistoclinProcedimientos.1");
		try {

			servicioHistoclinConsentosinfo.eliminarConsentosinfoPorEventosExterna(
					objHistoclinProcedimientos.getId().getCiaopr(), 
					objHistoclinProcedimientos.getId().getHisclicod(), 
					objHistoclinProcedimientos.getId().getProcedimcod(),
					iniciaTransaccion
					);
			System.out.println("eliminar.ServicioHistoclinProcedimientos.2");
			super.eliminar(pojo, iniciaTransaccion);	
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("e.ServicioHistoclinProcedimientos.eliminar: " + e.getMessage());
		}
	}


	public void eliminarProcedimientoPorEventosExterna(String ciaopr, Integer hisclicod, Integer procedimcod){
		HistoclinProcedimientos objHistoclinProcedimientos = null;
		try {
			objHistoclinProcedimientos = buscarProcedimiento(ciaopr, hisclicod, procedimcod );
			this.eliminar(objHistoclinProcedimientos, true);
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("e.eliminarProcedimientoPorEventosExterna:: " + e.getMessage());
		}
	}

	public HistoclinProcedimientos buscarProcedimiento(String ciaopr, Integer hisclicod, Integer procedimcod){
		HistoclinProcedimientos objHistoclinProcedimientos = null;
		String query = "";
		try {
			query = "FROM HistoclinProcedimientos tabla WHERE tabla.id.ciaopr='" + ciaopr + "'" +
			" and tabla.id.hisclicod = " + hisclicod +
			" and tabla.id.procedimcod = " + procedimcod;
			
			List histoclinProcedimientos = propiedadDAO.ejecutarQueryConsulta(query);
			objHistoclinProcedimientos = (HistoclinProcedimientos)histoclinProcedimientos.get(0);
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("ServicioHistoclinProcedimientos.buscarProcedimiento.servicioHistoclinDiagnosticos.buscarDiagnosticoOrden:: " + e.getMessage());
		}
		
		return objHistoclinProcedimientos;
	}
	
	
	public ServicioCorrelativosHistoclin getServicioCorrelativosHistoclin() {
		return servicioCorrelativosHistoclin;
	}

	public void setServicioCorrelativosHistoclin(
			ServicioCorrelativosHistoclin servicioCorrelativosHistoclin) {
		this.servicioCorrelativosHistoclin = servicioCorrelativosHistoclin;
	}



	public ServicioHistoclinConsentosinfo getServicioHistoclinConsentosinfo() {
		return servicioHistoclinConsentosinfo;
	}



	public void setServicioHistoclinConsentosinfo(
			ServicioHistoclinConsentosinfo servicioHistoclinConsentosinfo) {
		this.servicioHistoclinConsentosinfo = servicioHistoclinConsentosinfo;
	}

}
